package main

import (
	"context"
	"fmt"
	"time"
)

// 因为超时时间设置为 2s，但是 main 函数中，3s 后才会调用 cancel()，因此，在调用 cancel() 函数前，子协程因为超时已经退出了。
func reqTask4(ctx context.Context, name string) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("stop", name)
			return
		default:
			fmt.Println(name, "send request")
			time.Sleep(1 * time.Second)
		}
	}
}

func main() {
	ctx,cancel := context.WithTimeout(context.Background(),2 * time.Second)
	go reqTask4(ctx,"worker1")
	go reqTask4(ctx,"worker2")
	time.Sleep(4 * time.Second)
	fmt.Println("before cancel")
	cancel()
	time.Sleep(3 * time.Second)

}
